// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

const db = cloud.database()
const _ = db.command

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  
  // 如果没有传入userId，则使用当前用户的openid
  const userId = event.userId || wxContext.OPENID
  
  try {
    // 首先尝试从user_stats集合获取统计数据
    const userStatsResult = await db.collection('user_stats')
      .where({
        _openid: userId
      })
      .get();
    
    // 如果找到了用户统计数据，直接返回
    if (userStatsResult.data && userStatsResult.data.length > 0) {
      const stats = userStatsResult.data[0];
      return {
        success: true,
        data: {
          works: stats.works || 0,
          collections: stats.collections || 0,
          likes: stats.likes || 0,
          likesGiven: stats.likesGiven || 0,
          favoritesReceived: stats.favoritesReceived || 0,
          fromCache: true // 标记数据来源于缓存
        }
      }
    }
    
    // 如果没有找到缓存的统计数据，则计算统计数据
    console.log('未找到用户统计缓存数据，开始计算统计数据');
    
    // 获取用户作品数量
    const worksCountResult = await db.collection('images')
      .where({
        _openid: userId
      })
      .count()
    
    // 获取用户收藏数量
    const collectionsCountResult = await db.collection('user_favorites')
      .where({
        _openid: userId
      })
      .count()
    
    // 获取用户点赞数量（用户点赞别人的作品）
    const likesGivenResult = await db.collection('user_likes')
      .where({
        _openid: userId
      })
      .count()
    
    // 获取用户获赞总数（用户作品被点赞的总数）
    const likesReceivedCount = await getUserLikesReceived(userId);
    
    // 获取用户收藏总数（用户作品被收藏的总数）
    const favoritesReceivedCount = await getUserFavoritesReceived(userId);
    
    // 计算完成后，更新或创建user_stats集合中的记录
    const statsData = {
      works: worksCountResult.total,
      collections: collectionsCountResult.total,
      likes: likesReceivedCount,
      likesGiven: likesGivenResult.total,
      favoritesReceived: favoritesReceivedCount,
      _openid: userId,
      updateTime: db.serverDate()
    };
    
    try {
      // 尝试更新现有记录
      const updateResult = await db.collection('user_stats')
        .where({
          _openid: userId
        })
        .update({
          data: statsData
        });
      
      // 如果没有更新任何记录，说明记录不存在，需要创建
      if (updateResult.stats.updated === 0) {
        await db.collection('user_stats').add({
          data: statsData
        });
      }
    } catch (cacheError) {
      // 缓存更新失败，只记录错误但不影响返回结果
      console.error('更新用户统计缓存失败:', cacheError);
    }
    
    return {
      success: true,
      data: {
        works: worksCountResult.total,
        collections: collectionsCountResult.total,
        likes: likesReceivedCount,
        likesGiven: likesGivenResult.total,
        favoritesReceived: favoritesReceivedCount,
        fromCache: false // 标记数据来源于计算
      }
    }
  } catch (error) {
    console.error('获取用户统计信息失败:', error)
    return {
      success: false,
      message: '获取用户统计信息失败: ' + error.message,
      error
    }
  }
}

// 获取用户作品被点赞的总数
async function getUserLikesReceived(userId) {
  try {
    // 先获取用户的所有作品ID
    const userImagesResult = await db.collection('images')
      .where({
        _openid: userId
      })
      .field({
        _id: true
      })
      .get();
    
    if (userImagesResult.data.length === 0) {
      return 0;
    }
    
    // 提取所有作品ID
    const imageIds = userImagesResult.data.map(item => item._id);
    
    // 查询这些作品的点赞数据
    // 由于可能超过20个作品ID（小程序限制），需要分批查询
    const batchSize = 10;
    let totalLikes = 0;
    
    for (let i = 0; i < imageIds.length; i += batchSize) {
      const batchIds = imageIds.slice(i, i + batchSize);
      
      const likesResult = await db.collection('user_likes')
        .where({
          imageId: db.command.in(batchIds)
        })
        .count();
      
      totalLikes += likesResult.total;
    }
    
    return totalLikes;
  } catch (error) {
    console.error('获取用户获赞数失败:', error);
    return 0;
  }
}

// 获取用户作品被收藏的总数
async function getUserFavoritesReceived(userId) {
  try {
    // 先获取用户的所有作品ID
    const userImagesResult = await db.collection('images')
      .where({
        _openid: userId
      })
      .field({
        _id: true
      })
      .get();
    
    if (userImagesResult.data.length === 0) {
      return 0;
    }
    
    // 提取所有作品ID
    const imageIds = userImagesResult.data.map(item => item._id);
    
    // 查询这些作品的收藏数据
    // 由于可能超过20个作品ID（小程序限制），需要分批查询
    const batchSize = 10;
    let totalFavorites = 0;
    
    for (let i = 0; i < imageIds.length; i += batchSize) {
      const batchIds = imageIds.slice(i, i + batchSize);
      
      const favoritesResult = await db.collection('user_favorites')
        .where({
          imageId: db.command.in(batchIds)
        })
        .count();
      
      totalFavorites += favoritesResult.total;
    }
    
    return totalFavorites;
  } catch (error) {
    console.error('获取用户被收藏数失败:', error);
    return 0;
  }
} 